2. Бројачи и суме¶
У овој глави
- уводимо појам бројача,
- показујемо како се рачунају суме, и
- то знање примењујемо на проблем рачунања просека низа бројева.
2.1. Бројач¶
Често је потребно да пребројимо колико у низу има елемената који имају неку особину. Стандардни начин да се ова врста проблема реши је да се једна променљива задужи за посао бројања и онда се она зове бројач.
Пример. Написати Пајтон функцију prebroj_petice
која у датом списку оцена броји петице. На пример,
prebroj_petice([3, 1, 5, 4, 5, 2, 5])
треба да врати
3
зато што наведени списак оцена садржи три петице.
Решење.
def prebroj_petice(spisak):
broj = 0
for ocena in spisak:
if ocena == 5: broj += 1
return broj
Функција prebroj_petice
прими списак оцена у коме треба да преброји петице и онда се понаша овако.
- Променљива
broj
ће бројати петице. Пошто још нисмо кренули са провером оцена, постављамо њену вредност на 0 (за сада нисмо наишли ни на једну петицу). - Наредбом
for ocena in spisak:
пролазимо крозspisak
тако што променљиваocena
редом узима вредности које су наведене на списку. Према томе, за сваку оцену са списка ћемо проверити да ли је једнака са 5, и ако јесте увећаћемо вредност променљивеbroj
. - На крају враћамо вредност променљиве
broj
као резултат рада функције.
Да погледамо како функција ради:
prebroj_petice([3, 1, 5, 4, 5, 2, 5])
Пример. Написати Пајтон функцију prebroj_ocene
која броји колико пута се у датом списку оцена појављује дата оцена. На пример,
prebroj_ocene([3, 1, 5, 4, 5, 2, 5], 4)
треба да врати
1
зато што наведени списак оцена садржи само једну четворку.
Решење.
def prebroj_ocene(spisak, n):
broj = 0
for ocena in spisak:
if ocena == n: broj += 1
return broj
Пример*. Написати Пајтон функцију prebroj_cifre
која за дати позитиван цео број утврђује колико он има цифара. На пример,
prebroj_cifre(12487)
треба да врати
5
зато што број 12487 има 5 цифара.
Решење.
def prebroj_cifre(n):
br_cif = 0
while n > 0:
br_cif += 1
n //= 10
return br_cif
Идеја програма је следећа.
све док број "има још цифара":
увећај број цифара за 1
"откини" последњу цифру броја
Условом n > 0
проверавамо да ли је остала још нека цифра у броју, док командом n //= 10
"откинемо" последњу цифру броја. Ево примера:
n = 12487
n //= 10
n
Ето: "откинули" смо последњу цифру броја n. Да пробамо још једном:
n //= 10
n
Ради!
Дакле, у сваком пролази кроз петљу броју n (крволочно) "откинемо" по једну цифру, па када падне на нулу знамо да смо му откинули све цифре, и тако смо сигурни да смо их све и пребројали.
Да проверимо функцију:
prebroj_cifre(12487)
Важна напомена. Подсетимо се да уграђена функција len
одређује број елемената у низу. Она се може испрограмирати овако (мада је, наравно, увек ефикасније позвати уграђену функцију):
def duzina_niza(niz):
broj = 0
for x in niz:
broj += 1
return broj
2.2. Збир елемената низа¶
Често је потребно сабрати елементе неког низа бројева, што можемо урадити следећом Пајтон функцијом:
def saberi(L):
zbir = 0
for x in L:
zbir += x
return zbir
Функција saberi
прими низ бројева који треба сабрати и ради овако.
- Променљива
zbir
ће полако акумулирати збир. Пошто још нисмо кренули са сабирањем, постављамо њену вредност на 0. - Наредбом
for x in L:
пролазимо кроз низL
тако што променљиваx
редом узима вредности које су наведене у низу. Тако постижемо да елементе низа, један по један, додајемо на збирzbir
. - На крају враћамо вредност променљиве
zbir
као резултат рада функције.
Да погледамо како функција ради:
saberi([3,1,2,4,9,0,-6])
Пример. Милица добија џепарац који је сваког месеца исти. За следећи месец Милица је испланирала низ трошкова. Написати Пајтон функцију dzeparac_je_dovoljan
која проверава да ли ће Милица моћи да својим џепарцем покрије све планиране трошкове. Функција треба да прими два податка: висину њеног џепарца и списак трошкова, и треба да испише поруку о томе да ли су њени планови реални. Функција не враћа никакву вредност.
На пример,
dzeparac_je_dovoljan(1500, [250, 500, 100, 100, 100, 100, 100])
треба да испише:
Dzeparac je dovoljan
док
dzeparac_je_dovoljan(1500, [250, 500, 200, 300, 100, 100, 100])
треба да испише:
Dzeparac NIJE dovoljan
Решење.
def dzeparac_je_dovoljan(dzeparac, troskovi):
ukupni_troskovi = saberi(troskovi)
if dzeparac >= ukupni_troskovi:
print("Dzeparac je dovoljan")
else:
print("Dzeparac NIJE dovoljan")
Да видимо како функција ради:
dzeparac_je_dovoljan(1500, [250, 500, 200, 300, 100, 100, 100])
Важна напомена. Подсетимо се да уграђена функција sum
одређује збир елемената у низу, попут функције saberi
који смо видели раније. Наравно, увек је ефикасније позвати уграђену функцију него нашу функцију.
2.3. Просек елемената низа¶
Да се подсетимо, просек низа бројева се рачуна овако:
$$ \hbox{просек низа } [x_1, x_2, \dots, x_n] = \frac{x_1 + x_2 + \dots + x_n}{n}. $$Дакле, да бисмо добили просек низа бројева саберемо све елементе низа и тако добијени број поделимо дужином низа.
У Пајтону се обе ове активности могу обавити позивом одговарајуће уграђене функције: функција len
рачуна дужину низа, док
функција sum
рачуна збир елемената низа бројева.
Како ћемо у много наврата рачунати просек, дефинисаћемо нову функцију која га рачуна:
def prosek(L):
return sum(L) / len(L)
Пример. Мирко из музичког има 5, 4, 5 и још једну оцену која се не види јер се преко ње разлило мастило. Просек његових оцена из музичког је 4. Која је то оцена преко које се разлило мастило?
Решење. Пробаћемо разне могућности:
prosek([5,4,5,5])
prosek([5,4,5,4])
prosek([5,4,5,3])
prosek([5,4,5,2])
Ето одговора! Оцена која се не види је 2.
2.4. Задаци¶
Задатак 1. Написати Пајтон функцију broj_pozitivnih
која утврђује колико у датом низу има позитивних бројева. На пример,
broj_pozitivnih([2, -1, 3, 0, -5, 1, 9])
треба да врати 4.
Задатак 2. Написати Пајтон функцију broj_prestupnih
која прими две године и утврди колико преступних година има у наведеном интервалу. На пример,
broj_prestupnih(1987, 2019)
треба да врати 8. У томе ти може помоћи следећа функција која проверава да ли је година преступна:
def prestupna_godina(g):
if g % 400 == 0 or (g % 100 != 0 and g % 4 == 0):
return True
else:
return False
Задатак 3*. Написати Пајтон функцију prebroj_max
која утврђује колико пута се у датом низу бројева појављује највећа вредност низа.
Задатак 4*. Дресирани жабац се налази на ливади. Када добије команду "s" он скочи један метар на север; када добије команду "j" он скочи један метар на југ; када добије команду "i" он скочи један метар на исток; а када добије команду "z" он скочи један метар на запад.
Написати Пајтон функцију skoci_zabac
која прима низ команди и онда утврђује да ли се жабац након извршеног низа команди вратио у тачку са које је кренуо. На пример,
skoci_zabac(["s", "z", "j", "i", "j", "i", "j", "s", "s", "z", "i", "z"])
треба да испише
Zabac se vratio kuci
док
skoci_zabac(["s", "i", "j", "i", "j", "i", "j", "s", "s", "z", "i", "z"])
треба да испише
Zabac se nije vratio kuci
Задатак 5*. Написати Пајтон функцију zbir_cifara
која рачуна збир цифара датог позитивног целог броја. На пример,
zbir_cifara(12487)
треба да врати 22.
Задатак 6. Судбински број неке особе се добија овако:
- Запишемо датум рођења те особе као један низ цифара, на пример: 15. мај 2001. $\to$ 15052001
- Саберемо цифре тог броја.
- Ако смо добили једноцифре број, то је судбински број особе.
- Ако нисмао добили једноцифрен број, саберемо цифре добијеног броја, и тако све док не добијемо једноцифрен број.
(а) Израчунај свој судбински број користећи функцију zbir_cifara
из претходног задатка.
(б) Напиши функцију sudbinski_broj
рачуна судбински број неке особе.
Важна напомена! Ово је само вежбица из програмирања у Пајтону. Немојте придавати никакав значај добијеном броју! Нумерологија је изашла из моде пре око хиљаду година.
Задатак 7. Милан у дневнику има неколико оцена из информатике. Напиши Пајтон функцију koliko_do_odlicnog_uspeha
која прима низ Миланових оцена и онда одређује колико петица Милан треба да добије из информатике да би наставник морао да му закључи 5. (Према Правилнику о оцењивању, наставник мора да закључи оцену 5 ученику чији просек оцена је барем 4,50.)